package com.xmotor.test_lottery;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * @Description 抽奖工具类
 * @Author Dang Xianyue
 * @Date 2020-11-08 19:55
 * @Version 1.0
 */
public class LotteryUtils {

    /**
     * 抽奖方法
     * <br/>
     * create by: leigq
     * <br/>
     * create time: 2019/7/5 23:08
     * @param orignalRates 商品中奖概率列表，保证顺序和实际物品对应
     * @return 中奖商品索引
     */
    public static int lottery(List<Double> orignalRates) {

        if (orignalRates == null || orignalRates.isEmpty()) {
            return -1;
        }

        int size = orignalRates.size();

        // 计算总概率，这样可以保证不一定总概率是1
        double sumRate = 0d;
        for (double rate : orignalRates) {
            sumRate += rate;
        }

        // 计算每个物品在总概率的基础下的概率情况
        List<Double> sortOrignalRates = new ArrayList<>(size);
        Double tempSumRate = 0d;
        for (double rate : orignalRates) {
            tempSumRate += rate;
            sortOrignalRates.add(tempSumRate / sumRate);
        }

        // 根据区块值来获取抽取到的物品索引
        double nextDouble = Math.random();
        sortOrignalRates.add(nextDouble);
        Collections.sort(sortOrignalRates);

        return sortOrignalRates.indexOf(nextDouble);
    }

}
